home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 681 / term / source.lha / ScreenPanel.c < prev    next >
C/C++ Source or Header  |  1992-05-09  |  18KB  |  679 lines

  1. /*
  2. **    $Id: ScreenPanel.c,v 1.5 92/05/01 12:52:58 olsen Sta Locker: olsen $
  3. **    $Revision: 1.5 $
  4. **    $Date: 92/05/01 12:52:58 $
  5. **
  6. **    Editing panel for screen configuration
  7. **
  8. **    Copyright © 1990-1992 by Olaf `Olsen' Barthel & MXM
  9. **        All Rights Reserved
  10. */
  11.  
  12. #include "termGlobal.h"
  13.  
  14. enum    {    GAD_MODES,GAD_MODE,GAD_NEWMODE,GAD_PALETTE,GAD_RED,GAD_GREEN,GAD_BLUE,GAD_MAKEPUBLIC,
  15.         GAD_SHANGHAI,GAD_USE,GAD_CANCEL };
  16.  
  17. #define WIDTH    451
  18. #define HEIGHT    175
  19.  
  20. WORD    WindowWidth    = WIDTH,
  21.     WindowHeight    = HEIGHT;
  22.  
  23.     /* The names of the 16 display modes. */
  24.  
  25. STATIC UBYTE *ModeNames[16] =
  26. {
  27.     "Hires",
  28.     "Hires interlaced",
  29.     "Super hires",
  30.     "Super hires interlaced",
  31.     "Productivity",
  32.     "Productivity interlaced",
  33.  
  34.     "PAL hires",
  35.     "PAL hires interlaced",
  36.     "PAL super hires",
  37.     "PAL super hires interlaced",
  38.  
  39.     "NTSC hires",
  40.     "NTSC hires interlaced",
  41.     "NTSC super hires",
  42.     "NTSC super hires interlaced",
  43.  
  44.     "A2024 10 Hz",
  45.     "A2024 15 Hz"
  46. };
  47.  
  48. STATIC struct Node    ModeNodes[16];
  49. STATIC struct List    ModeList;
  50. STATIC BYTE        ModeLimited;
  51.  
  52.     /* ModeOkay(ULONG ID):
  53.      *
  54.      *    Checks whether a display mode ID will do for deep
  55.      *    screen bitmaps.
  56.      */
  57.  
  58. BYTE __regargs
  59. ModeOkay(ULONG ID)
  60. {
  61.     struct DimensionInfo DimensionInfo;
  62.  
  63.     if(GetDisplayInfoData(NULL,(APTR)&DimensionInfo,sizeof(struct DimensionInfo),DTAG_DIMS,ID))
  64.     {
  65.         if(DimensionInfo . MaxDepth >= 4)
  66.             return(TRUE);
  67.     }
  68.  
  69.     return(FALSE);
  70. }
  71.  
  72. #ifdef ASLSM_FilterFunc
  73.  
  74. STATIC UBYTE *
  75. CreateNewMode(ULONG Mode)
  76. {
  77.     STATIC UBYTE    Buffer[DISPLAYNAMELEN];
  78.     struct NameInfo    NameInfo;
  79.  
  80.     if(!GetDisplayInfoData(NULL,(APTR)&NameInfo,sizeof(struct NameInfo),DTAG_NAME,Mode))
  81.     {
  82.         struct DimensionInfo DimensionInfo;
  83.  
  84.         if(!GetDisplayInfoData(NULL,(APTR)&DimensionInfo,sizeof(struct DimensionInfo),DTAG_NAME,Mode))
  85.             strcpy(Buffer,LocaleString(MSG_SCREENPANEL_UNKNOWN_TXT));
  86.         else
  87.         {
  88.             UBYTE *MonitorName;
  89.  
  90.             switch(Mode & MONITOR_ID_MASK)
  91.             {
  92.                 case NTSC_MONITOR_ID:        MonitorName = "NTSC: ";
  93.                                 break;
  94.  
  95.                 case PAL_MONITOR_ID:        MonitorName = "PAL: ";
  96.                                 break;
  97.  
  98.                 case VGA_MONITOR_ID:        MonitorName = "VGA: ";
  99.                                 break;
  100.  
  101.                 case A2024_MONITOR_ID:        MonitorName = "A2024: ";
  102.                                 break;
  103.  
  104.                 default:            MonitorName = "";
  105.                                 break;
  106.             }
  107.  
  108.             SPrintf(Buffer,"%s%ld × %ld",MonitorName,DimensionInfo . TxtOScan . MaxX - DimensionInfo . TxtOScan . MinX + 1,DimensionInfo . TxtOScan . MaxY - DimensionInfo . TxtOScan . MinY + 1);
  109.         }
  110.     }
  111.     else
  112.         strcpy(Buffer,NameInfo . Name);
  113.  
  114.     return(Buffer);
  115. }
  116.  
  117. STATIC LONG __saveds __asm
  118. ModeFilter(register __a1 ULONG ID)
  119. {
  120.     if(ModeLimited)
  121.         return((LONG)ModeOkay(ID));
  122.     else
  123.         return(TRUE);
  124. }
  125.  
  126. STATIC BYTE __regargs
  127. SelectDisplayMode(struct Window *Window,ULONG *Mode)
  128. {
  129.     struct ScreenModeRequester    *Request;
  130.     struct Hook             FilterHook;
  131.     BYTE                 Result = FALSE;
  132.  
  133.     FilterHook . h_Entry    = (APTR)ModeFilter;
  134.     FilterHook . h_SubEntry    = NULL;
  135.     FilterHook . h_Data    = NULL;
  136.  
  137.     if(Request = (struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,
  138.         ASLSM_Window,        Window,
  139.         ASLSM_InitialDisplayID,    *Mode,
  140.         ASLSM_PropertyFlags,    DIPF_IS_WB,
  141.         ASLSM_FilterFunc,    &FilterHook,
  142.         ASLSM_PrivateIDCMP,    TRUE,
  143.     TAG_DONE))
  144.     {
  145.         if(AslRequestTags(Request,TAG_DONE))
  146.         {
  147.             *Mode = Request -> sm_DisplayID;
  148.  
  149.             Result = TRUE;
  150.         }
  151.  
  152.         FreeAslRequest(Request);
  153.     }
  154.  
  155.     return(Result);
  156. }
  157.  
  158. #endif    /* ASLSM_FilterFunc */
  159.  
  160. STATIC struct Gadget *
  161. CreateAllGadgets(LONG *ModeNumber,LONG *NumModes,struct Configuration *LocalConfig,struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge,BYTE WrongMode)
  162. {
  163.     struct Gadget        *Gadget;
  164.     struct NewGadget     NewGadget;
  165.     UWORD             Counter = 0;
  166.     BYTE             Count = 0,i,Mode;
  167.  
  168.     WindowWidth    = WIDTH;
  169.     WindowHeight    = HEIGHT;
  170.  
  171.     memset(&NewGadget,0,sizeof(struct NewGadget));
  172.  
  173.     if(Gadget = CreateContext(GadgetList))
  174.     {
  175.         WORD NewTop;
  176.  
  177.         if(LocalConfig -> ColourMode == COLOUR_EIGHT || LocalConfig -> ColourMode == COLOUR_SIXTEEN)
  178.             ModeLimited = TRUE;
  179.         else
  180.             ModeLimited = FALSE;
  181.  
  182. #ifdef ASLSM_FilterFunc
  183.         if(AslBase -> lib_Version < 38)
  184. #endif    /* ASLSM_FilterFunc */
  185.         {
  186.             memset(&ModeList,0,sizeof(struct List));
  187.             memset(ModeNodes,0,sizeof(struct Node) * 16);
  188.  
  189.             NewList(&ModeList);
  190.  
  191.             *NumModes = 0;
  192.  
  193.                 /* This loop runs all possible display modes through `ModeNotAvailable'
  194.                  * to determine which resolutions are not supported by the current
  195.                  * monitor spec.
  196.                  */
  197.  
  198.             for(i = 0 ; i < 16 ; i++)
  199.             {
  200.                 if(!ModeNotAvailable(ModeID[i]))
  201.                 {
  202.                     if(ModeLimited)
  203.                     {
  204.                         if(ModeOkay(ModeID[i]))
  205.                         {
  206.                             if(LocalConfig -> DisplayMode == ModeID[i])
  207.                                 Mode = Count;
  208.  
  209.                             ModeNodes[Count] . ln_Name = ModeNames[i];
  210.                             ModeNodes[Count] . ln_Type = i;
  211.  
  212.                             AddTail(&ModeList,&ModeNodes[Count++]);
  213.                         }
  214.                     }
  215.                     else
  216.                     {
  217.                         if(LocalConfig -> DisplayMode == ModeID[i])
  218.                             Mode = Count;
  219.  
  220.                         ModeNodes[Count] . ln_Name = ModeNames[i];
  221.                         ModeNodes[Count] . ln_Type = i;
  222.  
  223.                         AddTail(&ModeList,&ModeNodes[Count++]);
  224.                     }
  225.                 }
  226.                 else
  227.                 {
  228.                     if(i == Mode)
  229.                         Mode = 0;
  230.                 }
  231.             }
  232.  
  233.             *NumModes = Count;
  234.  
  235.             *ModeNumber = Mode;
  236.  
  237.             NewGadget . ng_Width        = 241;
  238.             NewGadget . ng_Height        = 60;
  239.             NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_AVAILABLE_DISPLAY_MODES_GAD);
  240.             NewGadget . ng_TextAttr        = &DefaultFont;
  241.             NewGadget . ng_VisualInfo    = VisualInfo;
  242.             NewGadget . ng_GadgetID        = Counter;
  243.             NewGadget . ng_Flags        = PLACETEXT_LEFT;
  244.             NewGadget . ng_LeftEdge        = (strlen(NewGadget . ng_GadgetText) + 2) * 8 + 1;
  245.             NewGadget . ng_TopEdge        = 1 + TopEdge;
  246.  
  247.             GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
  248.                 GT_Underscore,        '_',
  249.                 GTLV_Labels,        &ModeList,
  250.                 GTLV_ShowSelected,    NULL,
  251.                 GTLV_Selected,        Mode,
  252.                 GTLV_Top,        Mode,
  253.             TAG_DONE);
  254.  
  255.             if(!Gadget)
  256.                 return(NULL);
  257.  
  258.             NewTop = Gadget -> TopEdge + Gadget -> Height + 13;
  259.         }
  260. #ifdef ASLSM_FilterFunc
  261.         else
  262.         {
  263.             WindowWidth    -= (3 * 8);
  264.             WindowHeight    -= 25;
  265.  
  266.             Counter = GAD_MODE;
  267.  
  268.             NewGadget . ng_Width        = 240;
  269.             NewGadget . ng_Height        = 12;
  270.             NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_CURRENT_DISPLAY_MODE_GAD);
  271.             NewGadget . ng_TextAttr        = &DefaultFont;
  272.             NewGadget . ng_VisualInfo    = VisualInfo;
  273.             NewGadget . ng_GadgetID        = Counter;
  274.             NewGadget . ng_Flags        = PLACETEXT_LEFT;
  275.             NewGadget . ng_LeftEdge        = 22 * 8 + 1;
  276.             NewGadget . ng_TopEdge        = 1 + TopEdge;
  277.  
  278.             if(ModeNotAvailable(LocalConfig -> DisplayMode))
  279.                 LocalConfig -> DisplayMode = HIRES_KEY;
  280.  
  281.             GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
  282.                 GT_Underscore,    '_',
  283.                 GTTX_Text,    CreateNewMode(LocalConfig -> DisplayMode),
  284.                 GTTX_Border,    TRUE,
  285.             TAG_DONE);
  286.  
  287.             NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_SELECT_NEW_DISPLAY_MODE_TXT);
  288.             NewGadget . ng_GadgetID        = Counter;
  289.             NewGadget . ng_Flags        = 0;
  290.             NewGadget . ng_TopEdge        = NewGadget . ng_Height + NewGadget . ng_TopEdge + 1;
  291.  
  292.             GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  293.                 GT_Underscore,        '_',
  294.             TAG_DONE);
  295.  
  296.             NewTop = NewGadget . ng_Height + NewGadget . ng_TopEdge + 1;
  297.         }
  298. #endif    /* ASLSM_FilterFunc */
  299.  
  300.         Counter = GAD_PALETTE;
  301.  
  302.         NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_EDIT_SCREEN_PALETTE_GAD);
  303.         NewGadget . ng_Width        = 240;
  304.         NewGadget . ng_Height        = 30;
  305.         NewGadget . ng_GadgetID        = Counter;
  306.         NewGadget . ng_TopEdge        = NewTop;
  307.         NewGadget . ng_Flags        = PLACETEXT_LEFT;
  308.  
  309.         GadgetArray[Counter++] = Gadget = CreateGadget(PALETTE_KIND,Gadget,&NewGadget,
  310.             GT_Underscore,        '_',
  311.             GTPA_Depth,        Config . ColourMode == COLOUR_EIGHT ? 3 : Screen -> RastPort . BitMap -> Depth,
  312.             GTPA_Color,        0,
  313.             GTPA_IndicatorWidth,    NewGadget . ng_Width / (1 << 2),
  314.             GTPA_IndicatorHeight,    NewGadget . ng_Height,
  315.             GA_Disabled,        WrongMode,
  316.         TAG_DONE);
  317.  
  318.         NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_RED_GAD);
  319.         NewGadget . ng_GadgetID        = Counter;
  320.         NewGadget . ng_TopEdge        = NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
  321.         NewGadget . ng_Height        = 10;
  322.         NewGadget . ng_Width        = 240;
  323.  
  324.         GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
  325.             GT_Underscore,        '_',
  326.             GTSL_Min,        0,
  327.             GTSL_Max,        15,
  328.             GTSL_Level,        0,
  329.             GTSL_LevelFormat,    "%2ld",
  330.             GTSL_MaxLevelLen,    2,
  331.             GA_Disabled,        WrongMode,
  332.         TAG_DONE);
  333.  
  334.         NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_GREEN_GAD);
  335.         NewGadget . ng_GadgetID        = Counter;
  336.         NewGadget . ng_TopEdge        = NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
  337.  
  338.         GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
  339.             GT_Underscore,        '_',
  340.             GTSL_Min,        0,
  341.             GTSL_Max,        15,
  342.             GTSL_Level,        0,
  343.             GTSL_LevelFormat,    "%2ld",
  344.             GTSL_MaxLevelLen,    2,
  345.             GA_Disabled,        WrongMode,
  346.         TAG_DONE);
  347.  
  348.         NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_BLUE_GAD);
  349.         NewGadget . ng_GadgetID        = Counter;
  350.         NewGadget . ng_TopEdge        = NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
  351.  
  352.         GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
  353.             GT_Underscore,        '_',
  354.             GTSL_Min,        0,
  355.             GTSL_Max,        15,
  356.             GTSL_Level,        0,
  357.             GTSL_LevelFormat,    "%2ld",
  358.             GTSL_MaxLevelLen,    2,
  359.             GA_Disabled,        WrongMode,
  360.         TAG_DONE);
  361.  
  362.         NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_MAKE_SCREEN_PUBLIC_GAD);
  363.         NewGadget . ng_GadgetID        = Counter;
  364.         NewGadget . ng_TopEdge        = NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
  365.         NewGadget . ng_Width        = 26;
  366.         NewGadget . ng_Height        = 11;
  367.  
  368.         GadgetArray[Counter++] = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
  369.             GT_Underscore,    '_',
  370.             GTCB_Checked,    LocalConfig -> MakeScreenPublic,
  371.         TAG_DONE);
  372.  
  373.         NewGadget . ng_GadgetText    = LocaleString(MSG_SCREENPANEL_SHANGHAI_WINDOWS_GAD);
  374.         NewGadget . ng_GadgetID        = Counter;
  375.         NewGadget . ng_TopEdge        = NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
  376.  
  377.         GadgetArray[Counter++] = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
  378.             GT_Underscore,    '_',
  379.             GTCB_Checked,    LocalConfig -> ShanghaiWindows,
  380.             GA_Disabled,    LocalConfig -> MakeScreenPublic ? FALSE : TRUE,
  381.         TAG_DONE);
  382.  
  383.         NewGadget . ng_Width        = 88;    /* NEW 52 */
  384.         NewGadget . ng_Height        = 12;
  385.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_USE_GAD);
  386.         NewGadget . ng_GadgetID        = Counter;
  387.         NewGadget . ng_Flags        = 0;
  388.         NewGadget . ng_LeftEdge        = 10;
  389.         NewGadget . ng_TopEdge        = WindowHeight - 3 - NewGadget . ng_Height;
  390.  
  391.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  392.             GT_Underscore,    '_',
  393.         TAG_DONE);
  394.  
  395.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_CANCEL_GAD);
  396.         NewGadget . ng_GadgetID        = Counter;
  397.         NewGadget . ng_LeftEdge        = WindowWidth - 10 - NewGadget . ng_Width;
  398.  
  399.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  400.             GT_Underscore,    '_',
  401.         TAG_DONE);
  402.     }
  403.  
  404.     return(Gadget);
  405. }
  406.  
  407. BYTE
  408. ScreenPanel(struct Configuration *MyConfig)
  409. {
  410.     struct Window    *PanelWindow;
  411.     struct Gadget    *GadgetList = NULL;
  412.     struct Gadget    *GadgetArray[GAD_CANCEL + 1];
  413.     LONG         ModeNumber,NumModes;
  414.  
  415.     BYTE         WrongMode;
  416.     WORD         i;
  417.  
  418.     if(Config . ColourMode == MyConfig -> ColourMode)
  419.         WrongMode = FALSE;
  420.     else
  421.         WrongMode = TRUE;
  422.  
  423.     CopyMem(MyConfig,&PrivateConfig,sizeof(struct Configuration));
  424.  
  425.     if(CreateAllGadgets(&ModeNumber,&NumModes,MyConfig,&GadgetArray[0],&GadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1,WrongMode))
  426.     {
  427.         if(PanelWindow = OpenWindowTags(NULL,
  428.             WA_Left,    (Screen -> Width - WindowWidth) >> 1,
  429.             WA_Top,        (Screen -> Height - WindowHeight) >> 1,
  430.             WA_Width,    WindowWidth,
  431.             WA_Height,    WindowHeight,
  432.  
  433.             WA_Activate,    TRUE,
  434.             WA_DragBar,    TRUE,
  435.             WA_DepthGadget,    TRUE,
  436.             WA_RMBTrap,    TRUE,
  437.             WA_DepthGadget,    TRUE,
  438.             WA_CloseGadget,    TRUE,
  439.             WA_CustomScreen,Screen,
  440.  
  441.             WA_IDCMP,    IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | SLIDERIDCMP | CHECKBOXIDCMP | LISTVIEWIDCMP | PALETTEIDCMP | BUTTONIDCMP,
  442.  
  443.             WA_Title,    LocaleString(MSG_SCREENPANEL_SCREEN_PREFERENCES_TXT),
  444.         TAG_DONE))
  445.         {
  446.             struct IntuiMessage    *Massage;
  447.             ULONG             Class,Code;
  448.             struct Gadget        *Gadget;
  449.             BYTE             Terminated = FALSE;
  450.             struct Node        *SomeNode;
  451.  
  452.             LONG             ColourNumber = 0;
  453.             BYTE             Red,Green,Blue;
  454.  
  455.             PushWindow(PanelWindow);
  456.  
  457.             Red    = (MyConfig -> Colours[ColourNumber] >> 8) & 0xF;
  458.             Green    = (MyConfig -> Colours[ColourNumber] >> 4) & 0xF;
  459.             Blue    = (MyConfig -> Colours[ColourNumber]     ) & 0xF;
  460.  
  461.             AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  462.             RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  463.             GT_RefreshWindow(PanelWindow,NULL);
  464.  
  465.             GT_SetGadgetAttrs(GadgetArray[GAD_RED],PanelWindow,NULL,
  466.                 GTSL_Level,Red,
  467.             TAG_DONE);
  468.  
  469.             GT_SetGadgetAttrs(GadgetArray[GAD_GREEN],PanelWindow,NULL,
  470.                 GTSL_Level,Green,
  471.             TAG_DONE);
  472.  
  473.             GT_SetGadgetAttrs(GadgetArray[GAD_BLUE],PanelWindow,NULL,
  474.                 GTSL_Level,Blue,
  475.             TAG_DONE);
  476.  
  477.             if(!WrongMode)
  478.                 LoadRGB4(VPort,&MyConfig -> Colours[0],16);
  479.  
  480.             while(!Terminated)
  481.             {
  482.                 WaitPort(PanelWindow -> UserPort);
  483.  
  484.                 while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
  485.                 {
  486.                     Class    = Massage -> Class;
  487.                     Code    = Massage -> Code;
  488.                     Gadget    = (struct Gadget *)Massage -> IAddress;
  489.  
  490.                     GT_ReplyIMsg(Massage);
  491.  
  492.                     if(Class == IDCMP_VANILLAKEY)
  493.                         KeySelect(GadgetArray,GAD_CANCEL,Code,PanelWindow,&Gadget,&Class,&Code);
  494.  
  495.                     if(Class == IDCMP_CLOSEWINDOW)
  496.                         Terminated = TRUE;
  497.  
  498.                     if(Class == IDCMP_MOUSEMOVE)
  499.                     {
  500.                         switch(Gadget -> GadgetID)
  501.                         {
  502.                             case GAD_RED:        Red = Code;
  503.  
  504.                                         MyConfig -> Colours[ColourNumber] = (Red << 8) | (Green << 4) | (Blue);
  505.  
  506.                                         LoadRGB4(VPort,MyConfig -> Colours,1 << (Screen -> RastPort . BitMap -> Depth));
  507.  
  508.                                         break;
  509.  
  510.                             case GAD_GREEN:        Green = Code;
  511.  
  512.                                         MyConfig -> Colours[ColourNumber] = (Red << 8) | (Green << 4) | (Blue);
  513.  
  514.                                         LoadRGB4(VPort,MyConfig -> Colours,1 << (Screen -> RastPort . BitMap -> Depth));
  515.  
  516.                                         break;
  517.  
  518.                             case GAD_BLUE:        Blue = Code;
  519.  
  520.                                         MyConfig -> Colours[ColourNumber] = (Red << 8) | (Green << 4) | (Blue);
  521.  
  522.                                         LoadRGB4(VPort,MyConfig -> Colours,1 << (Screen -> RastPort . BitMap -> Depth));
  523.  
  524.                                         break;
  525.  
  526.                             default:        break;
  527.                         }
  528.                     }
  529.  
  530.                     if(Class == IDCMP_GADGETUP)
  531.                     {
  532.                         switch(Gadget -> GadgetID)
  533.                         {
  534.                             case GAD_RED:        Red = Code;
  535.  
  536.                                         MyConfig -> Colours[ColourNumber] = (Red << 8) | (Green << 4) | (Blue);
  537.  
  538.                                         LoadRGB4(VPort,MyConfig -> Colours,1 << (Screen -> RastPort . BitMap -> Depth));
  539.  
  540.                                         break;
  541.  
  542.                             case GAD_GREEN:        Green = Code;
  543.  
  544.                                         MyConfig -> Colours[ColourNumber] = (Red << 8) | (Green << 4) | (Blue);
  545.  
  546.                                         LoadRGB4(VPort,MyConfig -> Colours,1 << (Screen -> RastPort . BitMap -> Depth));
  547.  
  548.                                         break;
  549.  
  550.                             case GAD_BLUE:        Blue = Code;
  551.  
  552.                                         MyConfig -> Colours[ColourNumber] = (Red << 8) | (Green << 4) | (Blue);
  553.  
  554.                                         LoadRGB4(VPort,MyConfig -> Colours,1 << (Screen -> RastPort . BitMap -> Depth));
  555.  
  556.                                         break;
  557.  
  558.                             case GAD_MAKEPUBLIC:    if(!GT_CHECKED(Gadget))
  559.                                         {
  560.                                             GT_SetGadgetAttrs(GadgetArray[GAD_SHANGHAI],PanelWindow,NULL,
  561.                                                 GTCB_Checked,    FALSE,
  562.                                                 GA_Disabled,    TRUE,
  563.                                             TAG_DONE);
  564.                                         }
  565.                                         else
  566.                                         {
  567.                                             GT_SetGadgetAttrs(GadgetArray[GAD_SHANGHAI],PanelWindow,NULL,
  568.                                                 GA_Disabled,    FALSE,
  569.                                             TAG_DONE);
  570.                                         }
  571.  
  572.                                         break;
  573.  
  574.                             case GAD_MODES:        if(SomeNode = GetListNode(Code,&ModeList))
  575.                                         {
  576.                                             MyConfig -> DisplayMode = ModeID[SomeNode -> ln_Type];
  577.                                             ModeNumber = SomeNode -> ln_Type;
  578.                                         }
  579.  
  580.                                         break;
  581. #ifdef ASLSM_FilterFunc
  582.                             case GAD_NEWMODE:    BlockWindow(PanelWindow);
  583.  
  584.                                         if(SelectDisplayMode(PanelWindow,&MyConfig -> DisplayMode))
  585.                                         {
  586.                                             GT_SetGadgetAttrs(GadgetArray[GAD_MODE],PanelWindow,NULL,
  587.                                                 GTTX_Text,    CreateNewMode(MyConfig -> DisplayMode),
  588.                                             TAG_DONE);
  589.                                         }
  590.  
  591.                                         ReleaseWindow(PanelWindow);
  592.  
  593.                                         break;
  594. #endif    /* ASLSM_FilterFunc */
  595.                             case GAD_PALETTE:    ColourNumber = Code;
  596.  
  597. SetPalette:                                    Red    = (MyConfig -> Colours[ColourNumber] >> 8) & 0xF;
  598.                                         Green    = (MyConfig -> Colours[ColourNumber] >> 4) & 0xF;
  599.                                         Blue    = (MyConfig -> Colours[ColourNumber]     ) & 0xF;
  600.  
  601.                                         GT_SetGadgetAttrs(GadgetArray[GAD_RED],PanelWindow,NULL,
  602.                                             GTSL_Level,Red,
  603.                                         TAG_DONE);
  604.  
  605.                                         GT_SetGadgetAttrs(GadgetArray[GAD_GREEN],PanelWindow,NULL,
  606.                                             GTSL_Level,Green,
  607.                                         TAG_DONE);
  608.  
  609.                                         GT_SetGadgetAttrs(GadgetArray[GAD_BLUE],PanelWindow,NULL,
  610.                                             GTSL_Level,Blue,
  611.                                         TAG_DONE);
  612.  
  613.                                         break;
  614.  
  615.                             case GAD_USE:        Terminated = TRUE;
  616.  
  617.                                         if(MyConfig -> ColourMode == COLOUR_EIGHT)
  618.                                         {
  619.                                             for(i = 0 ; i < 8 ; i++)
  620.                                                 MyConfig -> Colours[i + 8] = MyConfig -> Colours[i];
  621.                                         }
  622.  
  623.                                         if(MyConfig == &Config)
  624.                                         {
  625.                                             CopyMem(&MyConfig -> Colours[0],&BlinkColours[0],sizeof(UWORD) * 16);
  626.  
  627.                                             switch(MyConfig -> ColourMode)
  628.                                             {
  629.                                                 case COLOUR_EIGHT:    for(i = 0 ; i < 8 ; i++)
  630.                                                                 BlinkColours[i + 8] = BlinkColours[0];
  631.  
  632.                                                             break;
  633.  
  634.                                                 case COLOUR_SIXTEEN:    break;
  635.  
  636.                                                 case COLOUR_AMIGA:
  637.                                                 default:        BlinkColours[3] = BlinkColours[0];
  638.                                                             break;
  639.                                             }
  640.                                         }
  641.  
  642.                                         MyConfig -> MakeScreenPublic    = GT_CHECKED(GadgetArray[GAD_MAKEPUBLIC]);
  643.                                         MyConfig -> ShanghaiWindows    = GT_CHECKED(GadgetArray[GAD_SHANGHAI]);
  644.  
  645.                                         break;
  646.  
  647.                             case GAD_CANCEL:    Terminated = TRUE;
  648.  
  649.                                         CopyMem(&PrivateConfig,MyConfig,sizeof(struct Configuration));
  650.  
  651.                                         if(!memcmp(&Config,MyConfig,sizeof(struct Configuration)))
  652.                                             LoadRGB4(VPort,&MyConfig -> Colours[0],16);
  653.                                         else
  654.                                             LoadRGB4(VPort,&Config . Colours[0],16);
  655.  
  656.                                         break;
  657.  
  658.                             default:        break;
  659.                         }
  660.                     }
  661.                 }
  662.             }
  663.  
  664.             RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  665.  
  666.             PopWindow();
  667.  
  668.             CloseWindow(PanelWindow);
  669.         }
  670.     }
  671.  
  672.     FreeGadgets(GadgetList);
  673.  
  674.     if(PrivateConfig . DisplayMode != MyConfig -> DisplayMode)
  675.         return(TRUE);
  676.     else
  677.         return(FALSE);
  678. }
  679.